package 正则表达式;

import java.util.regex.Matcher;
import java.util.regex.Pattern;
/*
Matcher类方法：

索引方法：
public int start() 返回以前匹配的初始索引。
public int start(int group) 返回在以前的匹配操作期间，由给定组所捕获的子序列的初始索引
public int end() 返回最后匹配字符之后的偏移量。
public int end(int group)返回在以前的匹配操作期间，由给定组所捕获子序列的最后字符之后的偏移量。
查找方法
public boolean lookingAt() 尝试将从区域开头开始的输入序列与该模式匹配。
public boolean find() 尝试查找与该模式匹配的输入序列的下一个子序列。
public boolean find(int start） 重置此匹配器，然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。
public boolean matches() 尝试将整个区域与模式匹配。
替换方法：
public Matcher appendReplacement(StringBuffer sb, String replacement) 实现非终端添加和替换步骤。
public StringBuffer appendTail(StringBuffer sb) 实现终端添加和替换步骤。
public String replaceAll(String replacement) 替换模式与给定替换字符串相匹配的输入序列的每个子序列。
public String replaceFirst(String replacement) 替换模式与给定替换字符串匹配的输入序列的第一个子序列。
public static String quoteReplacement(String s) 返回指定字符串的字面替换字符串。这个方法返回一个字符串，就像传递给Matcher类的appendReplacement 方法
                                                一个字面字符串一样工作。
*/
/*
//start 和 end 方法
public class 使用Matcher方法{
//	\b: 匹配一个字边界，即字与空格间的位置。例如，"er\b"匹配"never"中的"er"，但不匹配"verb"中的"er"。
//	\B: 非字边界匹配。"er\B"匹配"verb"中的"er"，但不匹配"never"中的"er"。
	private static final String REGEX = "\\bcat(\\b|\\B)";  //cat前面是边界，后面可是边界或不是边界
	private static final String INPUT = "cat catcat cattie cat";

	public static void main(String[] args) {
		Pattern p = Pattern.compile(REGEX);
		Matcher m = p.matcher(INPUT); // 获取 matcher 对象
		int count = 0;
		while (m.find()) {//尝试查找与该模式匹配的输入序列的下一个子序列。
			count++;
			System.out.println("Match number " + count);
			System.out.println("start(): " + m.start());
			System.out.println("end(): " + m.end());
		}
	}
}
*/
//可以看到这个例子是使用单词边界，以确保字母 "c" "a" "t" 并非仅是一个较长的词的子串。它也提供了一些关于输入字符串中匹配发生位置的有用信息。
//Start 方法返回在以前的匹配操作期间，由给定组所捕获的子序列的初始索引，end 方法最后一个匹配字符的索引加 1。

/*
【matches 和 lookingAt 方法】
matches 和 lookingAt 方法都用来尝试匹配一个输入序列模式。它们的不同是 matches 要求整个序列都匹配，而lookingAt 不要求。
lookingAt 方法虽然不需要整句都匹配，但是需要从第一个字符开始匹配。
这两个方法经常在输入字符串的开始使用。
我们通过下面这个例子，来解释这个功能：
*/
/*
//matches 和 lookingAt 方法
public class 使用Matcher方法{
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static final String INPUT2 = "ooooofoooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;
    private static Matcher matcher2;
 
    public static void main( String[] args ){
       pattern = Pattern.compile(REGEX);
       matcher = pattern.matcher(INPUT);
       matcher2 = pattern.matcher(INPUT2);
 
       System.out.println("Current REGEX is: "+REGEX);
       System.out.println("Current INPUT is: "+INPUT);
       System.out.println("Current INPUT2 is: "+INPUT2);
 
 
       System.out.println("lookingAt(): "+matcher.lookingAt());//true
       System.out.println("matches(): "+matcher.matches());//false
       System.out.println("lookingAt(): "+matcher2.lookingAt());//false
   }
}
*/
//【replaceFirst 和 replaceAll 方法】
//replaceFirst 和 replaceAll 方法用来替换匹配正则表达式的文本。不同的是，replaceFirst 替换首次匹配，replaceAll 替换所有匹配。
/*
public class 使用Matcher方法{
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. All dogs say meow.";
    private static String REPLACE = "cat";
 
    public static void main(String[] args) {
       Pattern p = Pattern.compile(REGEX);
       // get a matcher object
       Matcher m = p.matcher(INPUT); 
       INPUT = m.replaceAll(REPLACE);
       System.out.println(INPUT);//The cat says meow. All cats say meow.
       
       INPUT = m.replaceFirst(REPLACE);
       System.out.println(INPUT);//The cat says meow. All dogs say meow.
   }
}
*/
//【appendReplacement 和 appendTail 方法】
//Matcher 类也提供了appendReplacement 和 appendTail 方法用于文本替换：

public class 使用Matcher方法{
   private static String REGEX = "a*b";
   private static String INPUT = "aabfooaabfooabfoobkkk";
   private static String REPLACE = "-";
   public static void main(String[] args) {
      Pattern p = Pattern.compile(REGEX);
      // 获取 matcher 对象
      Matcher m = p.matcher(INPUT);
      StringBuffer sb = new StringBuffer();
      while(m.find()){//尝试查找与该模式匹配的输入序列的下一个子序列
         m.appendReplacement(sb,REPLACE);//仍返回Matcher对象，find()指针变动，sb追加替换值。
      }
      m.appendTail(sb);//把剩余的部分追加至sb
      System.out.println(sb.toString());//-foo-foo-foo-kkk
      
      String re1 = "abc";
      System.out.println("abc".matches(re1));//判断匹配真假
      
      //分组匹配
      Pattern p1 = Pattern.compile("(\\d{3,4})\\-(\\d{7,8})");
      Matcher m1 = p1.matcher("010-0123456");
      
      System.out.println(m1.toString());
      //boolean var=m1.matches();
      boolean var1=m1.find();
      System.out.println(m1.group(0));//需先执行boolean var=m1.matches()或boolean var1=m1.find()，否则出错
      System.out.println(m1.group(1));//
      System.out.println(m1.group(2));//
      
//      if (m1.matches()) {
//      	String g = m1.group();
//      	String g0 = m1.group(0);
//          String g1 = m1.group(1);
//          String g2 = m1.group(2);
//          System.out.println(g);
//          System.out.println(g0);
//          System.out.println(g1);
//          System.out.println(g2);
//      } else {
//          System.out.println("匹配失败!");
//      }
   }
}
